package sample4.dnd;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;

public class PopupView extends ImageView {
    private static final Bitmap.Config DRAG_BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
    private static final int BACKGROUND_COLOR = Color.parseColor("#77ff0000");
    private static final int Y_GAP = 0;

    private WindowManager mWindowManager;
    private WindowManager.LayoutParams mLayoutParams;
    private boolean mDragging = false;
    private int mBaseX;
    private int mBaseY;
    private int[] mItemLocation = new int[2];

    public PopupView(Context context) {
        super(context);
        mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

        // レイアウトを初期化する
        initLayoutParams();
    }

    /**
     * ドラッグ開始
     * @param itemView
     */
    public void startDrag(int x, int y, View itemView) {
        // ドラッグ終了処理が未完了の場合、前回のドラッグ処理が不正に終了しているかもしれない。
        // 念のため、ドラッグ終了処理を行う。
        if (mDragging) {
            stopDrag();
        }

        // ドラッグ開始座標を保持する
        mBaseX = x;
        mBaseY = y;

        // ドラッグする項目の初期位置を保持する
        itemView.getLocationInWindow(mItemLocation);

        // ドラッグ中の画像イメージを設定する
        setBitmap(itemView);

        // WindowManagerに登録する
        updateLayoutParams(x, y);
        mWindowManager.addView(this, mLayoutParams);
        mDragging = true;
    }

    /**
     * ドラッグ中処理
     * @param x
     * @param y
     */
    public void doDrag(int x, int y) {
        // ドラッグ開始していなければ中止
        if (mDragging == false) {
            return;
        }

        // ImageViewの位置を更新
        updateLayoutParams(x, y);
        mWindowManager.updateViewLayout(this, mLayoutParams);
    }

    /**
     * ドラッグ項目の描画を終了する
     */
    public void stopDrag() {
        // ドラッグ開始していなければ中止
        if (mDragging == false) {
            return;
        }

        // WindowManagerから除去する
        mWindowManager.removeView(this);
        mDragging = false;
    }

    /**
     * ドラッグ中の項目を表す画像を作成する
     */
    private void setBitmap(View itemView) {
        Bitmap bitmap = Bitmap.createBitmap(itemView.getWidth(),
                itemView.getHeight(), DRAG_BITMAP_CONFIG);
        Canvas canvas = new Canvas();
        canvas.setBitmap(bitmap);
        itemView.draw(canvas);
        setImageBitmap(bitmap);
        setBackgroundColor(BACKGROUND_COLOR);
    }

    /**
     * ImageView 用 LayoutParams の初期化
     */
    private void initLayoutParams() {
        // getLocationInWindow()と座標系を合わせるためFLAG_LAYOUT_IN_SCREENを設定する。
        // FLAG_LAYOUT_IN_SCREENを設定すると、端末ディスプレイ全体の左上を原点とする座標系となる。
        // 設定しない場合、ステータスバーを含まない左上を原点とする。
        mLayoutParams = new WindowManager.LayoutParams();
        mLayoutParams.gravity = Gravity.TOP | Gravity.LEFT;
        mLayoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
        mLayoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
        mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
                | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
        mLayoutParams.format = PixelFormat.TRANSLUCENT;
        mLayoutParams.windowAnimations = 0;
    }

    /**
     * ImageView 用 LayoutParams の座標情報を更新
     */
    private void updateLayoutParams(int x, int y) {
        // ドラッグ中であることが分かるように少し上にずらす
        // layoutParams.x = itemLocation[0] + x - baseX;
        mLayoutParams.x = 0;
        mLayoutParams.y = mItemLocation[1] + y - mBaseY - Y_GAP;
    }
}